package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.entrega2;
import java.text.SimpleDateFormat;

import junit.framework.Assert;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.uqbar.commons.utils.ApplicationContext;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Categoria;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Evasor;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.InfractorFrecuente;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Inhabilitado;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.VerificadorDePagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCategorias;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorVehiculos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.*;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionMail;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionSMS;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class Punto2TestCase {
	
	//Los nombre de las capturas en este caso no importan porque son todas iguales.
	//Hacemos varias instancias, para que las agregue en un Set
	public Captura captura1;
	public Captura captura2;
	public Captura captura3;
	public Captura captura4;
	public Captura captura5;
	public Captura captura6;
	public Zona zona = new Zona("Zona Roja", "12345");
	public TipoInfraccion tipoInfraccion = new TipoInfraccion("Mal Estacionamiento", 20, 300);
	
	//public AdministradorCategorias adCat = new AdministradorCategorias();
	public AdministradorCategorias adCat;
	public Categoria evasor = new Evasor();
	public Categoria inhabilitado = new Inhabilitado();
	public Categoria iFrecuente = new InfractorFrecuente();
	public Vehiculo vehiculo;
	public AdministradorVehiculos adVehiculos;
	public SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
	//public VerificadorPagos verificadorPagos = new VerificadorPagos();
	public VerificadorPagos verificadorPagos;
	
	@Before
	public void setUp(){
		
		ApplicationContext.getInstance().configureSingleton(VerificadorDePagos.class, new VerificadorPagos());
		ApplicationContext.getInstance().configureSingleton(AdministradorCategorias.class, new AdministradorCategorias());
		ApplicationContext.getInstance().configureSingleton(AdministradorVehiculos.class, new AdministradorVehiculos());
		
		adCat = ApplicationContext.getInstance().getSingleton(AdministradorCategorias.class);
		adVehiculos = ApplicationContext.getInstance().getSingleton(AdministradorVehiculos.class);
		verificadorPagos = ApplicationContext.getInstance().getSingleton(VerificadorDePagos.class);
		
		DateTime unaFechaCualquiera = new DateTime();
		captura1 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		captura2 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		captura3 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		captura4 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		captura5 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		captura6 = new Captura(zona, tipoInfraccion, new Image(), unaFechaCualquiera);
		
		adCat.addCategoria(evasor);
		adCat.addCategoria(inhabilitado);
		adCat.addCategoria(iFrecuente);
		
		//vehiculo = new Vehiculo("ASD 123", adCat, verificadorPagos);
		vehiculo = new Vehiculo("ASD 123");
		
		NotificacionSMS notificacionSMS = new NotificacionSMS(new SMSSender());
		
		MailSender unMailSender = new MailSender();
		NotificacionMail notificacionMail = new NotificacionMail(unMailSender);
		notificacionMail.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionMail.setDireccion("teponeslagorra@policiafederal.gob.ar");
		
		tipoInfraccion.addNotificacion(notificacionSMS);
		
		evasor.setNotificacion(notificacionMail);
		inhabilitado.setNotificacion(notificacionMail);
		
		adVehiculos = new AdministradorVehiculos();
		adVehiculos.addVehiculo(vehiculo);
	}
	
	@Test
	public void verificarInfraccionInvalidadaFrecuente(){
		
		vehiculo.addCaptura(captura1);
		vehiculo.addCaptura(captura2);
		vehiculo.addCaptura(captura3);
		vehiculo.addCaptura(captura4);
		vehiculo.addCaptura(captura5);
		vehiculo.addCaptura(captura6);
		
		Assert.assertTrue(vehiculo.estaEnLaCategoria(iFrecuente));
		
		vehiculo.removeCaptura(vehiculo.getCapturas().get(5));
		
		Assert.assertFalse(vehiculo.estaEnLaCategoria(iFrecuente));
		
	}
	
	@Test
	public void verificarInfraccionInvalidadaEvasor(){
		
		vehiculo.addCaptura(captura1);
		vehiculo.addCaptura(captura2);
		vehiculo.addCaptura(captura3);
		vehiculo.addCaptura(captura4);
		
		Assert.assertTrue(vehiculo.estaEnLaCategoria(evasor));
		
		// Para qu�? O sea, es necesario?
		// Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntos() + captura2.getPuntos()
		// 		+ captura3.getPuntos() + captura4.getPuntos()));
		
		vehiculo.removeCaptura(vehiculo.getCapturas().get(3));
		
		// Assert.assertFalse(vehiculo.getCapturas().contains(captura4));
		Assert.assertFalse(vehiculo.estaEnLaCategoria(evasor));
		// Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntos() + captura2.getPuntos()
		//		+ captura3.getPuntos()));
		
	}

	
	// ESTE EST� REPETIDO?
//	@Test
//	public void verificarInfraccionInvalidadaIFrecuente(){
//		
//		vehiculo.addCaptura(captura1);
//		vehiculo.addCaptura(captura2);
//		vehiculo.addCaptura(captura3);
//		vehiculo.addCaptura(captura4);
//		vehiculo.addCaptura(captura5);
//		vehiculo.addCaptura(captura6);
//		
//		Assert.assertTrue(vehiculo.estaEnLaCategoria(iFrecuente));
//		Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntos() + captura2.getPuntos()
//				+ captura3.getPuntos() + captura4.getPuntos() + captura5.getPuntos() + captura6.getPuntos()));
//		
//		vehiculo.removeCaptura(captura6);
//		
//		Assert.assertFalse(vehiculo.getCapturas().contains(captura6));
//		Assert.assertFalse(vehiculo.estaEnLaCategoria(iFrecuente));
//		Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntos() + captura2.getPuntos()
//				+ captura3.getPuntos()  + captura4.getPuntos() + captura5.getPuntos()));
//		
//	}
	
	@Test
	public void verificarInfraccionInvalidadaInhabilitado(){
		
		vehiculo.addCaptura(captura1);
		vehiculo.addCaptura(captura2);
		vehiculo.addCaptura(captura3);
		vehiculo.addCaptura(captura4);
		vehiculo.addCaptura(captura5);
		
		Assert.assertTrue(vehiculo.estaEnLaCategoria(inhabilitado));
		Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntosInfraccion() + captura2.getPuntosInfraccion()
				+ captura3.getPuntosInfraccion() + captura4.getPuntosInfraccion() + captura5.getPuntosInfraccion()));
		
		vehiculo.removeCaptura(captura5);
		
		Assert.assertFalse(vehiculo.getCapturas().contains(captura5));
		Assert.assertFalse(vehiculo.estaEnLaCategoria(inhabilitado));
		Assert.assertTrue(vehiculo.getPuntosRegistro() == 100 - (captura1.getPuntosInfraccion() + captura2.getPuntosInfraccion()
				+ captura3.getPuntosInfraccion()  + captura4.getPuntosInfraccion()));
		
	}
}